package isjinhao.jlox.grammar.expression.represention;

import isjinhao.jlox.grammar.expression.visitor.ExpressionVisitor;
import isjinhao.jlox.grammar.expression.visitor.ExpressionEvaluator;
import isjinhao.jlox.grammar.expression.visitor.ExpressionPrintVisitor;

/**
 * Expression是一个可以进行计算的表达式，加减乘除，或与非等。
 * Expression对象的执行结果不会对其他任何变量或系统环境产生影响。即不会产生 side effect。
 *
 * @Author ISJINHAO
 * @Date 2021/2/20 20:47
 */
public abstract class Expression {

    private ExpressionPrintVisitor printer = new ExpressionPrintVisitor();
    private ExpressionEvaluator evaluator = new ExpressionEvaluator();

    public abstract <R> R accept(ExpressionVisitor<R> expressionVisitor);

    @Override
    public String toString() {
        return printer.visit(this);
    }

    public Object calculate(){
        return evaluator.visit(this);
    }

}